/**
 * 
 */
package fr.gfi.agraf.service.mapper;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.springframework.util.CollectionUtils;

import fr.gfi.agraf.persistence.entity.Saisie;
import fr.gfi.agraf.persistence.entity.Tache;
import fr.gfi.agraf.service.enumeration.EtatEnum;
import fr.gfi.agraf.vue.bean.ActiviteDTO;
import fr.gfi.agraf.vue.bean.EtatDTO;
import fr.gfi.agraf.vue.bean.SaisieDTO;
import fr.gfi.agraf.vue.bean.TacheDTO;

/**
 * @author Fw
 * 
 */
public class TacheMapper {

	/**
	 * Constructeur
	 */
	private TacheMapper() {
		// Empty constructeur
	}

	/**
	 * Convertit l'entité en dto
	 * 
	 * @param tache
	 * @return
	 */
	public static TacheDTO entityToDTO(final Tache tache, final Date date, final ActiviteDTO activite) {
		final Set<Saisie> saisieSet = tache.getListeSaisies();
		final TacheDTO tacheDTO = new TacheDTO();
		final List<SaisieDTO> saisieDTOList = tacheDTO.getSaisieList();
		if (activite == null) {
			tacheDTO.setActivite(ActiviteMapper.getDtoByEntity(tache.getActivite(),null));
		} else {
			tacheDTO.setActivite(activite);
		}
		tacheDTO.setChargeInit(tache.getChargeInit());
		tacheDTO.setCommentaire(tache.getCommentaire());
		tacheDTO.setDateCreation(tache.getDateCreation());
		tacheDTO.setDateDebut(tache.getDateDebut());
		tacheDTO.setDateFin(tache.getDateFin());
		tacheDTO.setId(tache.getId());
		tacheDTO.setLibelle(tache.getLibelle());
		if (tache.getUtilisateur() != null) {
			tacheDTO.setUtilisateur(UtilisateurMapper.entityToDTO(tache.getUtilisateur()));
		}
		saisieDTOList.addAll(SaisieMapper.entityToDTOList(saisieSet));
		tacheDTO.setSaisie(SaisieMapper.entityListToDTOUnitary(saisieSet, date));
		tacheDTO.setConsommeTotal(getConsommeTotal(saisieDTOList));
		final Saisie lastSaisie = getLastSaisie(tache);
		if (lastSaisie == null) {
			tacheDTO.setRaf(tacheDTO.getChargeInit());
			final EtatDTO etatDTO = new EtatDTO();
			etatDTO.setLibelle(EtatEnum.CREE.getLibelle());
			etatDTO.setLibelleCss(EtatEnum.CREE.getLibelleCss());
			etatDTO.setId(EtatEnum.CREE.getId());
			tacheDTO.setEtat(etatDTO);
		} else {
			tacheDTO.setRaf(lastSaisie.getRaf());
			tacheDTO.setEtat(EtatMapper.entityToDto(lastSaisie.getEtat()));
		}
		final double consoEtRaf = tacheDTO.getConsommeTotal() + tacheDTO.getRaf();
		final double tauxProduct = tacheDTO.getChargeInit() / consoEtRaf;
		final double tauxPercent = tauxProduct * 100;
		tacheDTO.setTauxProductiviteEstimee((int) tauxPercent);
		return tacheDTO;
	}

	/**
	 * Récupere la derniere saisie d'une tache
	 * 
	 * @param tache
	 * @return
	 */
	private static Saisie getLastSaisie(final Tache tache) {
		Saisie lastSaisie = null;
		final Set<Saisie> listeSaisies = tache.getListeSaisies();
		if (!CollectionUtils.isEmpty(listeSaisies)) {
			for (final Saisie saisie : listeSaisies) {
				if (lastSaisie == null) {
					lastSaisie = saisie;
					continue;
				}
				if (saisie.getDate().after(lastSaisie.getDate())) {
					lastSaisie = saisie;
				}
			}
		}
		return lastSaisie;
	}

	/**
	 * Convertit liste d'entité en dto
	 * 
	 * @param tacheList
	 * @return
	 */
	public static List<TacheDTO> entityToDTOList(final List<Tache> tacheList, final ActiviteDTO activiteDTO) {
		final List<TacheDTO> tacheDTOList = new ArrayList<TacheDTO>();
		if (!CollectionUtils.isEmpty(tacheList)) {
			for (final Tache tache : tacheList) {
				tacheDTOList.add(entityToDTO(tache, null, activiteDTO));
			}
		}
		return tacheDTOList;

	}

	/**
	 * Calcul le consommé total d'une tache
	 * 
	 * @param saisieSet
	 * @return
	 */
	private static Double getConsommeTotal(final List<SaisieDTO> saisieSet) {
		Double result = 0D;
		if (!CollectionUtils.isEmpty(saisieSet)) {
			for (final SaisieDTO saisie : saisieSet) {
				result += saisie.getConsomme();
			}
		}
		return result;

	}

}
